[Home] Python으로 돌아가기

파이썬에서 다중 생성자를 사용하기 어려운 이유

📖 목차


1. 개요

파이썬에서는 객체를 생성할 때 사용하는 생성자 메서드 __init__를 하나만 정의할 수 있다. 이는 자바, C++과 같이 매개변수의 개수나 타입에 따라 여러 생성자를 오버로딩할 수 있는 언어와는 다른 특징이다. 그 이유는 파이썬이 함수 정의와 호출에서 키워드 인자(keyword arguments)를 허용하기 때문이다.

2. 파이썬의 함수 호출 방식

파이썬의 함수는 기본값 지정과 키워드 인자 사용을 통해 유연한 호출 방식을 제공한다. 다음 예제를 참고한다:


def greet(name="anonymous", age=None):
    ...

하나의 함수 정의로 다양한 인자 조합을 처리할 수 있기 때문에, 파이썬은 함수 오버로딩을 필요로 하지 않으며 실제로도 지원하지 않는다.

3. 다중 생성자의 한계

파이썬 클래스 내에서 생성자를 중복 정의할 경우, 마지막으로 정의된 __init__만이 유효하게 남고, 앞선 정의는 모두 덮어쓰여 사라진다. 예를 들어 아래와 같은 코드는 올바르게 작동하지 않는다:


class Person:
    def __init__(self, name):
        self.name = name

    def __init__(self, name, age):
        self.name = name
        self.age = age

위 예제에서 첫 번째 __init__는 무시되고, 두 번째만 적용되므로 Person("Alice")는 오류를 발생시킨다.

4. 가능한 대안

1) 클래스 메서드를 활용한 대체 생성자


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_name(cls, name):
        return cls(name, age=0)

    @classmethod
    def from_birth_year(cls, name, year):
        return cls(name, 2025 - year)

2) 가변 인자 사용


class Person:
    def __init__(self, *args, **kwargs):
        self.name = kwargs.get('name', 'unknown')
        self.age = kwargs.get('age', 0)

위와 같은 방식으로 여러 형태의 객체 생성을 하나의 생성자에서 처리할 수 있다. 이는 파이썬이 제공하는 유연한 함수 호출 메커니즘 덕분이다.